{
  rules: { // 具体规则
    'accessor-pairs': 2, // getter/setter成对出现
    'arrow-spacing': [1, {
      'before': true,
      'after': true
    }], // 箭头函数前后有空格
    'array-bracket-spacing': [1, 'never'], // 数组内前后无空格
    'block-spacing': [1, 'always'], // 单行{}前后有空格
    'brace-style': [2, '1tbs', {
      'allowSingleLine': true
    }], // {}换行，单行不用
    'camelcase': [2, {
      'properties': 'never'
    }], // 属性名可以不是驼峰
    'comma-dangle': [1, 'only-multiline'], // 数组/对象最后一个必须有,
    'comma-spacing': [1, {
      'before': false,
      'after': true
    }], // ,前有空格, 后无空格
    'comma-style': [2, 'last'], // ,在最后，不能换行
    'constructor-super': 1, // super()在必须构造函数内
    'curly': [2, 'multi-line'], // if/while等函数可以多行不带{}
    'dot-location': [2, 'property'], // .的位置可以在换行
    'eol-last': 1, // 文件末尾需要空白行
    'eqeqeq': [2, 'allow-null'], // 必须===, null除外
    'generator-star-spacing': [2, {
      'before': true,
      'after': true
    }], // generator函数前后有空格
    'handle-callback-err': [2, '^(err|error)$'], // 有err/error必须处理异常
    'indent': [2, 2, {
      'SwitchCase': 1
    }], // 缩进2格，switch中1格
    'jsx-quotes': [2, 'prefer-single'], // jsx属性用单引号
    'key-spacing': [2, {
      'beforeColon': false,
      'afterColon': true
    }], // 对象属性前有空格, 后无空格
    'keyword-spacing': [2, {
      'before': true,
      'after': true
    }], // 关键词前后有空格, 如if-else
    'new-cap': [2, {
      'newIsCap': true,
      'capIsNew': false
    }], // new后必须大写开头构造函数, 大写开头不一定要new
    'new-parens': 2, // new的构造函数必须带参数
    'object-curly-spacing': [2, 'always', {
      objectsInObjects: false
    }], // 对象{}前后有空格, 对象内的对象例外
    'no-array-constructor': 2, // Array(10)->yes, Array(1, 2)->no
    'no-caller': 2, // 禁止caller/callee
    'no-class-assign': 2, // 禁止赋值class
    'no-cond-assign': 2, // 条件不能有赋值
    'no-const-assign': 2, // 禁止赋值常量(const)
    'no-control-regex': 2, // reg中不能有控制符号
    'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 1, // node环境prod禁用
    'no-delete-var': 2, // 不能delete变量，可以用在对象
    'no-dupe-args': 2, // 参数不能重复
    'no-dupe-class-members': 2, // class中方法不能有重复
    'no-dupe-keys': 2, // 对象key不能重复
    'no-duplicate-case': 2, // switch不能有重复case
    'no-empty-character-class': 2, // reg中不能有空字符串
    'no-empty-pattern': 2, // 解构不能有空解构模式
    'no-eval': 2, // 不能用eval
    'no-ex-assign': 2, // 不能复制catch中的error
    'no-extend-native': 2, // 不能扩展Object原型
    'no-extra-bind': 2, // bind的函数体中要有明确的this
    'no-extra-boolean-cast': 2, // 禁止多余的Boolean转换
    'no-extra-parens': [2, 'functions'], // 函数中禁止多余的括号
    'no-fallthrough': 2, // switch需要break
    'no-floating-decimal': 2, // float中0不能省略
    'no-func-assign': 2, // 禁止赋值函数
    'no-implied-eval': 2, // 禁止隐性eval
    'no-inner-declarations': [2, 'functions'], // 禁止在条件中声明function
    'no-invalid-regexp': 2, // 禁止无用的reg
    'no-irregular-whitespace': 2, // 禁止不规则空格
    'no-iterator': 2, // 禁止使用__iterator__属性
    'no-label-var': 2, // 禁止label var
    'no-labels': [2, {
      'allowLoop': false,
      'allowSwitch': false
    }], // 禁止label表达式
    'no-lone-blocks': 2, // 禁止无用的{}
    'no-mixed-spaces-and-tabs': 2, // space和tab不混用
    'no-multi-spaces': 2, // 禁止多空格
    'no-multi-str': 2, // 禁止多行的string
    'no-multiple-empty-lines': [2, {
      'max': 1
    }], // 禁止多空行，最大1行
    'no-native-reassign': 2, // 禁止赋值原生对象(window/Object...)
    'no-negated-in-lhs': 2, // !(key in object)->yes, !key in object->no
    'no-new-object': 2, // new Object()->no
    'no-new-require': 2, // new require(xxx)->no
    'no-new-symbol': 2, // new Symbol(xxx)->no
    'no-new-wrappers': 2, // String/Number等不能用new
    'no-obj-calls': 2, // 禁止calling全局对象属性，如Math/JSON
    'no-octal': 2, // 禁止八进制文字
    'no-octal-escape': 2, // 禁止八进制转义
    'no-path-concat': 2, // __dirname和__filename禁止string拼接
    'no-proto': 2, // 禁止使用__proto__
    'no-redeclare': 2, // 禁止重新复制var
    'no-regex-spaces': 2, // 禁止reg出现多个空格
    'no-return-assign': [2, 'except-parens'], // 禁止return中赋值
    'no-self-assign': 2, // 禁止自身赋值
    'no-self-compare': 2, // 禁止自身比较, 如果NaN->Number.isNaN
    'no-sequences': 2, // 禁止,操作符
    'no-shadow-restricted-names': 2, // 禁止跟踪严格模式下部分关键词
    'no-spaced-func': 2, // function的()不要空格
    'no-sparse-arrays': 2, // array不能用空元素
    'no-this-before-super': 2, // super()前不能用this
    'no-throw-literal': 2, // 禁止直接throw内容，必须是Error()
    'no-trailing-spaces': 1, // 禁止多余的空格
    'no-undef': 2, // 禁止使用未赋值变量
    'no-undef-init': 2, // 变量不能初始化为undefined
    'no-unexpected-multiline': 2, // 禁止有疑义的多行表达式
    'no-unmodified-loop-condition': 2, // 循环中的变量要在循环中修改
    'no-unneeded-ternary': [2, {
      'defaultAssignment': false
    }], // 禁止不必要的三元操作符
    'no-unreachable': 2, // return/throw等之后不应有表达式
    'no-unsafe-finally': 2, // 禁止不安全的finally
    'no-unused-vars': [1, {
      'vars': 'all',
      'args': 'none'
    }], // 禁止不使用的变量，参数可以
    'no-useless-call': 2, // 禁止无用的call
    'no-useless-computed-key': 2, // 禁止无用的计算属性
    'no-useless-constructor': 2, // 禁止无用的constructor
    'no-whitespace-before-property': 2, // 属性前不能有空格
    'no-with': 2, // 禁用with
    'one-var': [2, {
      'initialized': 'never'
    }], // 只能一个var, 初始化不检查
    'operator-linebreak': [2, 'after', {
      'overrides': {
        '?': 'before',
        ':': 'before'
      }
    }], // 操作符换行, 默认在行末, ?和:在下一行前
    'padded-blocks': [2, 'never'], // 作用域中没有padded的空行
    'quotes': [2, 'single', {
      'avoidEscape': true,
      'allowTemplateLiterals': true
    }], // 使用单引号, 转义或者模版可以例外
    'semi': [2, 'never'], // 禁用结尾;
    'semi-spacing': [2, {
      'before': false,
      'after': true
    }], // ;前有空格, 后无空格
    'space-before-blocks': [2, 'always'], // 作用域前有空格
    'space-in-parens': [2, 'never'], // 括号内无空格
    'space-infix-ops': 2, // 插入的操作符需要空格, 如+/-
    'space-unary-ops': [2, {
      'words': true,
      'nonwords': false
    }], // 操作符单词类要空格(new/delete), 非单词不要空格(++/--/!)
    'spaced-comment': [2, 'always', {
      'markers': ['!', ',', '/', '-']
    }], // 注释要空格，markers为例外
    'template-curly-spacing': [2, 'never'], // 模版字符串中变量无空格
    'use-isnan': 2, // 使用isNaN
    'valid-typeof': 2, // typeof的字符串必须正确
    'wrap-iife': [2, 'any'], // 立即调用的function必须有括号
    'yield-star-spacing': [2, 'both'], // yield的*前后有空格
    'yoda': [2, 'never'], // 条件中变量在前
    'prefer-const': 0, // 能用const场景用const
    'no-useless-escape': 0, // 不检查escape
    'space-before-function-paren': 0, // 函数括号无空格
    "react/jsx-uses-react": "error",
    "react/jsx-uses-vars": "error",
  }
}
# 建议：官方文档对每个规则有简单易懂的例子说明，有时间的同学可以查阅一遍。
# 官方文档 http://eslint.org/docs/rules/

extends: 'eslint:recommended'

# 规则按照首字母在字母表升序排序
rules:

  # 单行代码块大括号后需要一个空格
  block-spacing: 2

  # 不使用外部块定义的变量
  block-scoped-var: 2

  # 大括号位置
  brace-style: [2, "1tbs"]

  # 变量命名规则
  camelcase: [2, { properties: "never" }]
  
  # 逗号后使用空格
  comma-spacing: 2

  # 逗号位置
  comma-style: [2, "last"]

  # 代码块返回一致性
  consistent-return: 2

  # 使用语句大括号
  curly: [2, "all"]

  # 需要default在SwitchCase
  default-case: 2

  # 属性读取方式 
  # `foo['bar'] -> foo.bar`
  dot-notation: [2, { allowKeywords: true }]

  # EOL
  eol-last: 2

  # 相等判断
  # 尽可能使用`===`
  eqeqeq: 2

  # 使用函数声明，而不是函数表达式
  func-style: [2, "declaration"]

  # 缩进空格
  # `SwitchCase`时需要一个空格
  indent: [2, 4, {SwitchCase: 1}]

  # 分号之间的空格
  key-spacing: [2, { beforeColon: false, afterColon: true }]

  # 换行符格式
  linebreak-style: [2, 'unix']

  # 类命名首字母大写
  new-cap: 2

  # 类构建函数需要括号
  new-parens: 2

  # 不允许使用`alert`函数
  no-alert: 2

  # 数组尽量不使用构造函数
  no-array-constructor: 2

  # 不使用`console`
  no-console: 0

  # 不使用`var x; delete x;`
  no-delete-var: 2

  # 不使用非遍历情况的label
  no-empty-label: 2

  # 不使用`eval`
  no-eval: 2

  # 不允许扩展原生类型
  no-extend-native: 2

  # 不使用不必要的bind
  no-extra-bind: 2

  # 不允许不停止SwitchCase的
  no-fallthrough: 2

  # 使用显式的浮点数定义
  # `.5 -> 0.5`
  no-floating-decimal: 2

  # 不使用非显式的函数执行
  # `setTimeout("alert('Hi!');", 100);`
  no-implied-eval: 2

  # 不使用非显式this关键字
  no-invalid-this: 2

  # 不使用和变量同名的便签名
  no-label-var: 2

  # 循环内不定义非执行的函数
  # 防止必包产生的作用域问题
  no-loop-func: 2

  # 不允许缩进不统一
  no-mixed-spaces-and-tabs: [2, false]

  # 不允许重复使用分隔空格
  no-multi-spaces: 2

  # 不允许转义换行符连接字符串
  no-multi-str: 2

  # 不允许赋值到关键字
  no-native-reassign: 2

  # 不嵌套ternary
  # `var foo = bar ? baz : qux === quxx ? bing : bam;`
  no-nested-ternary: 2

  # 使用`new`需要赋值
  no-new: 2

  # 不使用类构建函数
  # `var x = new Function("a", "b", "return a + b");`
  no-new-func: 2

  # 不使用Object构造函数
  no-new-object: 2

  # 原始类型不使用`new`
  # `typeof new String('foo') == 'object'`
  # `typeof String('foo') == 'string'`
  no-new-wrappers: 2

  # 不使用八进制数字
  # `var num = 071; -> 57`
  no-octal: 2
  no-octal-escape: 2

  # 不使用被废弃的`__proto__`
  no-proto: 2

  # 不重复声明变量
  no-redeclare: 2

  # 返回语句不赋值
  no-return-assign: 2

  # 不使用不加括号的逗号运算符
  no-sequences: 2

  # 嵌套块代码不重复变量名
  no-shadow: 2

  no-shadow-restricted-names: 2
  no-spaced-func: 2
  no-trailing-spaces: 2
  no-undef: 2
  no-undef-init: 2
  no-undefined: 2
  no-underscore-dangle: 2
  no-unused-expressions: 2
  no-unused-vars: [2, {vars: "all", args: "after-used"}]
  no-use-before-define: 2
  no-useless-concat: 2
  no-with: 2

  # 引号
  quotes: [2, 'single']

  radix: 2

  # 分号
  semi: [2, 'never']

  semi-spacing: [2, {before: false, after: true}]
  space-after-keywords: [2, "always"]
  space-before-blocks: 2
  space-before-function-paren: [2, "never"]
  space-infix-ops: 2
  space-return-throw-case: 2
  space-unary-ops: [2, {words: true, nonwords: false}]
  spaced-comment: [2, "always", { exceptions: ["-"]}]
  wrap-iife: 2
  yoda: [2, "never"]

env:
  browser: true
